﻿#ifndef __B2P_H
#define __B2P_H

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#ifdef __cplusplus
 extern "C" {
#endif

#define UINT8               unsigned char      
#define UINT16              unsigned short     
#define UINT32              unsigned int       

#define FILE_TYPE_BM        (0x4D42)
#define FILE_TYPE_BA        (0x4142)
#define FILE_TYPE_CI        (0x4943)
#define FILE_TYPE_CP        (0x5043)
#define FILE_TYPE_IC        (0x4349)
#define FILE_TYPE_PI        (0x4950)

#define FILE_TYPE_AD        (0x4441)

#define PRINTER_TYPE_BMP	(0x2A1B)

typedef struct
{  
    UINT16 bfType;              /*!< 图片类型 */
    UINT32 bfSize;              /*!< 文件大小 */
    UINT16 bfReserved1;         /*!< 保留项1 */
    UINT16 bfReserved2;         /*!< 保留项2 */
    UINT32 bfOffBits;           /*!< 图片数据起始偏移地址 */
}BITMAP_FILE_HEADER;            /*!< 文件头 */

typedef struct 
{
	UINT32 biSize;              /*!< 信息头结构长度 */
	UINT32 biWidth;             /*!< 图片的宽度 */
	UINT32 biHeight;            /*!< 图片的高度 */
	UINT32 biPlanes:16;         /*!< 固定为1 */
	UINT32 biBitCount:16;       /*!< 每个像素点的位数 */
	UINT32 biCompression;       /*!< 压缩类型 */
	UINT32 biSizeImage;         /*!< 位图数据大小 */
	UINT32 biXPelsPerMeter;     /*!< 水平分辨率（像素点/米） */
	UINT32 biYPelsPerMeter;     /*!< 垂直分辨率（像素点/米） */
	UINT32 biClrUsed;           /*!< 位图中实际使用的颜色数 */
	UINT32 biClrImportant;      /*!< 位图中重要的颜色数 */
}BITMAP_INFO_HEADER;            /*!< 信息头 */

typedef struct
{
    UINT8 R;                    /*!< 红 */
    UINT8 G;                    /*!< 绿 */
    UINT8 B;                    /*!< 蓝 */
    UINT8 A;                    /*!< 透明度 */
}COLOR_TYPE;

typedef struct
{
    BITMAP_FILE_HEADER header;  /*!< 文件头 */
    BITMAP_INFO_HEADER info;    /*!< 信息头 */
    COLOR_TYPE* palette;        /*!< 调色板 */
    UINT8* bData;               /*!< 位图数据 */
}BITMAP_FILE;

typedef struct
{
	UINT32 type:	16;		    /*!< 图片类型，"AD"表示广告图片 */
	UINT32 offset:	16;		    /*!< 数据起始的偏移地址 */
	UINT32 size;		        /*!< 图片数据的大小 */
	UINT32 width;		        /*!< 图片的宽度 */
	UINT32 height;		        /*!< 图片的高度 */
	UINT32 reserve1;	        /*!< 保留 */
	UINT32 reserve2;	        /*!< 保留 */
	UINT32 reserve3;	        /*!< 保留 */
}PRINTER_FILE_HEADER;           /*!< 热敏打印机位图指令文件头 */

typedef UINT8 ARRAY3[3];

typedef struct
{
    UINT16 type;                /*!< 打印机位图打印指令码标识 */
    UINT8 mode;					/*!< 打印机位图打印模式 */
    UINT16 size;				/*!< 打印位图块的字符数 */
}PRINTER_BMP_CMD;

typedef struct block
{
	ARRAY3 *column;			    /*!< 打印位图块的点阵数据 */
	struct block* next;			/*!< 指向下一个打印位图块 */
}PRINTER_BLOCK_NODE;

typedef struct line
{
	UINT8* bData;				/*!< BMP的行点阵数据 */
	struct line* next;			/*!< 指向下一行 */
}IMAGE_LINE_NODE;

static int Get_BMP_File(FILE* f, BITMAP_FILE* bmp);
static int Write_Printer_Command(FILE* f, PRINTER_BMP_CMD* cmd);

#ifdef __cplusplus
}
#endif

#endif
 